
package com.party.pay;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

/**
 * 迅支付退款请求参数
 */
@Data
public class XunayRefundRequest{
    // 必传参数
    private String mchNo;          // 商户号（与下单一致）
    private String appId;          // 应用ID（与下单一致）
    private String mchRefundNo;    // 商户退款单号（商户自行生成，唯一）
    private String mchOrderNo;     // 原商户订单号（下单时的 mchOrderNo）
    private String payOrderId;     // 原支付订单号（下单返回的 payOrderId，二选一：mchOrderNo/payOrderId）
    private int refundAmount;      // 退款金额（单位：分，需 ≤ 原订单金额）
    private String currency;       // 货币代码（默认 cny）
    private String refundReason;         // 退款原因（如“用户申请退款”）
    private long reqTime;          // 请求时间（13位时间戳）
    private String version;        // 接口版本（固定 1.0）
    private String signType;       // 签名类型（固定 MD5）
    private String sign;           // 签名值

    // 可选参数
    private String notifyUrl;      // 退款结果异步通知地址
    private String extParam;       // 扩展参数（回调时原样返回）

    /**
     * 转换为签名用的 Map（排除 sign 字段，按 ASCII 排序）
     */
    public Map<String, String> toSignMap() {
        Map<String, String> map = new HashMap<>();
        map.put("mchNo", mchNo);
        map.put("appId", appId);
        map.put("mchRefundNo", mchRefundNo);
        map.put("mchOrderNo", mchOrderNo);
        map.put("payOrderId", payOrderId);
        map.put("refundAmount", String.valueOf(refundAmount));
        map.put("currency", currency);
        map.put("refundReason", refundReason);
        map.put("reqTime", String.valueOf(reqTime));
        map.put("version", version);
        map.put("signType", signType);
        // 可选参数非空才加入
        if (notifyUrl != null && !notifyUrl.isEmpty()) {
            map.put("notifyUrl", notifyUrl);
        }
        if (extParam != null && !extParam.isEmpty()) {
            map.put("extParam", extParam);
        }
        return map;
    }
}

